События являются объектами, унаследованными от класса QEvent, который представляет нечто, произошедшее внутри приложения или в результате внешней активности, о чем нужно знать приложению. События могут быть получены и обработаны любым экземпляром подкласса QObject, но главным образом они относятся к виджетам.

Как доставляются события

Когда происходит событие, то для его представления Qt создаёт объект события, создавая экземпляр соответствующего подкласса QEvent, и доставляет его отдельному экземпляру класса QObject (или одного из его подклассов), вызывая его функцию event().

Эта функция не обрабатывает событие сама; основываясь на типе доставленного события, она вызывает обработчик событий для данного конкретного типа события и отправляет ответ на основе того, будет ли событие принято или проигнорировано.

Некоторые события, например, QMouseEvent и QKeyEvent, поступают из оконной системы; некоторые, например, QTimerEvent, поступают из других источников; некоторые поступают из самого приложения.

Типы событий

Большинство типов событий имеют специальные классы, а именно:

Тип события Класс события
QEvent::ActionAdded QActionEvent
QEvent::ActionChanged QActionEvent
QEvent::ActionRemoved QActionEvent
QEvent::ChildAdded QChildEvent
QEvent::ChildPolished QChildEvent
QEvent::ChildRemoved QChildEvent
QEvent::Close QCloseEvent
QEvent::DragEnter QDragEnterEvent
QEvent::DragLeave QDragLeaveEvent
QEvent::DragMove QChildEvent
QEvent::Drop QDropEvent
QEvent::Enter QEnterEvent
QEvent::FileOpen QFileOpenEvent
QEvent::FocusIn QFocusEvent
QEvent::FocusOut QFocusEvent
QEvent::FocusAboutToChange QFocusEvent
QEvent::Hide QHideEvent
QEvent::HoverEnter QHoverEvent
QEvent::HoverLeave QHoverEvent
QEvent::HoverMove QHoverEvent
QEvent::IconDrag QIconDragEvent
QEvent::InputMethod QInputMethodEvent
QEvent::InputMethodQuery QInputMethodQueryEvent
QEvent::KeyPress QKeyEvent
QEvent::KeyRelease QKeyEvent
QEvent::MouseButtonDblClick QMouseEvent
QEvent::MouseButtonPress QMouseEvent
QEvent::MouseButtonRelease QMouseEvent
QEvent::MouseMove QMouseEvent
QEvent::Move QMoveEvent
QEvent::Paint QPaintEvent
QEvent::Resize QResizeEvent
QEvent::ScrollPrepare QScrollPrepareEvent
QEvent::Scroll QScrollEvent
QEvent::Shortcut QShortcutEvent
QEvent::ShortcutOverride QKeyEvent
QEvent::Show QShowEvent
QEvent::Timer QTimerEvent
QEvent::ToolTip QHelpEvent
QEvent::Wheel QWheelEvent
QEvent::WindowStateChange QWindowStateChangeEvent

  Каждый класс создан как подкласс QEvent и добавляет функции, зависимые от события. Например, QResizeEvent добавляет функции size() и oldSize(), чтобы разрешить виджетам узнать как изменились их размеры.

Некоторые классы поддерживают более одного реального типа событий. QMouseEvent поддерживает щелчки кнопкой мыши, двойные щелчки, перемещение и другие связанные операции.

Каждое событие имеет связанный с ним тип, который можно получить, обратившись к функции type(). Это может быть использовано в качестве удобного источника информации о типах во время выполнения для быстрого определения подкласса данного объекта события.

Поскольку программам нужно реагировать разными и сложными способами, механизмы доставки событий являются гибким.

Обработчики событий

Обычный способ доставки события - вызов виртуальной функции. Например, событие QMoveEvent доставляется вызовом QWidget::moveEvent($event). Эта виртуальная функция вызывается когда виджет перемещается на новую позицию. Если в своей реализации виртуальной функции вы не выполнили всю необходимую работу, вам может понадобиться вызывать реализацию из базового класса: parent::moveEvent($event).

Например, следующий код обрабатывает щелчки левой кнопкой мыши на пользовательском виджете в то время, как щелчки остальными кнопками передаются в базовый класс QWidget:

# QMouseEvent
class Widget extends QWidget {
    private $count = 0;

    /** @override mousePressEvent */
    public function mousePressEvent($event) {
        switch ($event->button()) {
        case Qt::LeftButton:
            // здесь обрабатываем левую кнопку мыши
            $this->count++;
            echo "Left button click counts: {$this->count}";
            break;

        default:
            // передаём остальные кнопки в базовый класс
            QWidget::mousePressEvent($event);
        }
    }
}

Неотъемлемой частью реализации обработчиков событий является аннотация @override с указанием имени переопределяемой виртуальной функции.

comments powered by HyperComments